package main

func main() {
	/*
		1.Goroutine：
			Goroutine 是一个轻量级的执行线程，多个 Goroutine 比一个线程轻量，所以管理 Goroutine 消耗的资源相对较少。
			Goroutine 是 Go 中最基本的执行单元，每一个 Go程序 至少有一个 Goroutine：主 Goroutine。程序启动时会自动创建。

			（1）线程：
				线程是一种轻量级进程，是 CPU 调度的最小单位。
				一个标准的线程由线程ID，当前指令指针（PC），寄存器集合 和 堆栈 组成。线程是进程中的一个实体，是被系统独立调度和分派的基本单位，
			  	线程自己不拥有系统资源，只拥有一点在运行中必不可少的资源，但它可与 同属于一个进程的其他线程共享进程所拥有的全部资源。
				线程拥有自己独立的栈和共享的堆，共享堆，不共享栈。
				线程的切换一般由操作系统调度。

			（2）协程：
				协程又称微线程，与子例程一样，协程也是一种程序组建，相对子例程而言，协程更为灵活，但在实践中使用没有子例程那样广泛。
				和线程类似，共享堆，不共享栈。
				协程的切换一般由程序员在代码中显示控制。他避免了上下文切换的额外耗费，兼顾了多线程的优点，简化了高并发程序的复杂。

			（3）Goroutine 和其他语言的协程在使用方式上类似，但从字面意义上来看不同（一个是 Goroutine，一个是 coroutine），
				再就是协程是一种协作任务控制机制，在最简单的意义上，协程不是并发的，而 Goroutine 支持并发的。
				Goroutine 可以运行在 一个或多个 线程 上。


		2.Channel
			Channel 就是多个 Goroutine 之间的沟通渠道。
			当我们想要将结果或错误，或任何其他类型的信息 从一个 Goroutine 传递到另一个 Goroutine 时，就可以使用通道（Channel）。

		3.context设计原理：
		（1）Go语言中的每一个请求都是通过一个单独的 Goroutine 进行处理的，
			HTTP/RPC 请求的处理器往往都会启动新的 Goroutine 访问数据库 和 RPC 服务，我们可能会创建多个 Goroutine 来处理一次请求，
			而 context 的主要作用就是在不同的 Goroutine 之间请求特定的数据、取消信号以及处理请求的截至日期。

							╭───> goroutine ───> goroutine
				goroutine ──│───> goroutine
							╰───> goroutine

		（2）每一个 context 都会从最顶层的 Goroutine 一层一层传递到最下层，这也就是 Goland 中上下文最常见的使用方式，
			如果没有 context，当上层执行的操作出现错误时，下层其实不会收到错误而是会继续执行下去

				╭──────────goroutine─────────╮
				╰────────────────────────────╯
							╭─────────goroutine────────╮
							╰──────────────────────────╯
									╭────────goroutine───────╮
									╰────────────────────────╯
			当最上层的 Goroutine 因为某些原因执行失败时，下两层的 Goroutine 由于没有接收到这个信号所以会继续工作；
			但是当我们正确的使用了 context 时，就可以在下层及时停掉无用的工作减少额外资源的消耗

	*/
}
